package com.shujia.wyh.day25;

import java.io.Serializable;

/*
        未序列化异常：
            NotSerializableException: com.shujia.wyh.day25.Person
            只有支持java.io.Serializable接口的对象才能写入流中。
            类的序列化由实现java.io.Serializable接口的类启用。
            不实现此接口的类将不会使任何状态序列化或反序列化。
            可序列化类的所有子类型都是可序列化的。

            通过观察API发现，Serializable接口中没有任何抽象方法和常量，说明它是一个标记接口。
            （回想一下，我们之前说过的Object类中的克隆）

            java.io.InvalidClassException: com.shujia.wyh.day25.Person;
            local class incompatible:
                stream classdesc serialVersionUID = 8333181233940260538,
                local class serialVersionUID = -2276749375407741261

           原因分析：
            根据刚刚简单的分析后发现，由于Person类实现了Serializable标记接口
            它本身应该有一个标记值，通过该类创建的对象也应该有着一样的标记值，假设一开始类的标记值是id=100

            在没有进行修改类之前：
                Person.class -- id=100
                写数据的适合：object -- id=100
                读数据的时候：object -- id=100

            在进行修改后（删除了一个private）
                Person.class -- id=200
                之前写的时候：object -- id=100
                读数据的时候：object -- id=100

            在实际开发中，因为业务的问题，不允许重复地往文件中或者数据库中重复写入，那怎么解决呢？

            这个问题本质上是由于id值地不匹配导致地，如果说有一个办法，无论我怎么修改class类，这个id值都不会变化就好了。
            Java在序列化中提供了一个ID值，可以让我们去设定。
            我们不需要手动去设定，自动生成即可。

            需求：现在在做序列化地时候，不想让年龄也进行序列化，怎么办？
            java提供了一个关键字给我们使用，可以让我们在序列化的时候选择哪些成员变量不被序列化
            transient

 */
public class Person implements Serializable {
    private static final long serialVersionUID = -2276749375407741261L;
    private String name;
    //    private int age;
    transient int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
